import { NextRequest, NextResponse } from 'next/server';
import { SessionRepository } from '@/lib/database/repositories/session-repository';
import { ClientInfo } from '@/lib/types/session';

/**
 * 从请求中提取客户端信息
 */
function extractClientInfo(request: NextRequest, clientInfoFromBody?: ClientInfo): ClientInfo {
  return {
    ipAddress: request.headers.get('x-forwarded-for') || undefined,
    userAgent: request.headers.get('user-agent') || undefined,
    referrer: request.headers.get('referer') || undefined, // 注意：HTTP头中正确拼写是'referer'（只有一个'r'）
    deviceType: clientInfoFromBody?.deviceType,
    ...(clientInfoFromBody || {})
  };
}


/**
 * 统一会话管理API - 处理所有会话相关操作
 */
export async function POST(request: NextRequest) {
  try {
    const { 
      sessionId,
      isVip,
      hasVipParam,
      path,
      validateSession, // 新增参数，表示是否需要校验会话有效性
      clientInfo: clientInfoFromBody
    } = await request.json().catch(() => ({}));
    
    const clientInfo = extractClientInfo(request, clientInfoFromBody);
    
    // 统一的会话获取和校验逻辑
    let session = null;
    let isNewSession = false;
    
    // 1. 如果有会话ID，尝试获取并验证会话
    if (sessionId) {
      session = await SessionRepository.getById(sessionId);
      // 检查会话是否存在且未过期
      const isValid = session && session.expiresAt > new Date();
      
      // 如果会话无效，且需要校验或明确无效，则创建新会话
      if (!isValid && (validateSession || !session)) {
        session = await SessionRepository.getOrCreate(
          sessionId,  // 传入sessionId创建带ID的新会话
          isVip || false
        );
        isNewSession = true;
      }
    } 
    // 2. 如果没有会话ID，直接创建新会话
    else {
      session = await SessionRepository.getOrCreate(
        undefined, 
        isVip || false
      );
      isNewSession = true;
    }
    
    // 如果是新创建的会话，立即返回
    if (isNewSession && session) {
      return NextResponse.json({
        sessionId: session.id,
        isVip: session.isVip,
        isNew: true
      });
    }
    
    // 如果会话不存在(此时不应该发生)，返回错误
    if (!session) {
      return NextResponse.json(
        { error: '无法创建或获取会话' },
        { status: 500 }
      );
    }
    
    // 3. 会话更新 - 统一处理所有会话更新逻辑
    const updateData: Record<string, any> = {
      lastActivityAt: new Date(),
      // 延长过期时间
      expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
    };
    
    // 更新VIP状态(如果有VIP参数)
    if (hasVipParam) {
      updateData.isVip = Boolean(isVip);
    }
    
    // 更新客户端信息(如果有)
    if (clientInfo) {
      Object.assign(updateData, {
        ipAddress: clientInfo.ipAddress,
        userAgent: clientInfo.userAgent,
        referrer: clientInfo.referrer,
        deviceType: clientInfo.deviceType
      });
    }
    
    // 更新会话(异步)
    SessionRepository.update(session.id, updateData)
      .then(() => {
        console.log('会话已更新', { sessionId: session?.id });
      })
      .catch(err => console.error('会话更新失败', err));
    
    // 返回响应
    return NextResponse.json({
      sessionId: session.id,
      isVip: hasVipParam ? Boolean(isVip) : session.isVip
    });
    
  } catch (error) {
    console.error('会话处理失败:', error);
    return NextResponse.json(
      { error: '会话处理失败' },
      { status: 500 }
    );
  }
} 